//  策略模式   定义一系列算法，把它们一个个封装起来，并且使它们可互相替换。该模式使得算法可独立于使用它的客户而变化。
// a)Strategy及其子类为组件提供了一系列可重用的算法，从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换。所谓封装算法，支持算法的变化。
// b)Strategy模式提供了用条件判断语句以外的另一种选择，消除条件判断语句，就是在解耦合。
//含有许多条件判断语句的代码通常都需要Strategy模式。
// c)与State类似，如果Strategy对象没有实例变量，那么各个上下文可以共享同一个Strategy对象，从而节省对象开销。

var isPositiveInteger = {
  validate: function(value) {
    return !!value.toString().match(/^[0-9]*[1-9][0-9]*$/i)
  }
}

var isInRange = {
  validate: function(value) {
    return isPositiveInteger.validate(value) && value < 100
  }
}

class Form {
  constructor(age, validator) {
    this.age = age;
    this.validator = validator;
    this.isValidate = this.isValidate();
  }
  setAge(age) {
    this.age = age
  }
  setValidator(validator) {
    this.validator = validator
  }
  isValidate() {
    return this.validator.validate(this.age)
  }
}
var form1 = new Form(101, isInRange)
var form2 = new Form(99, isInRange)
var form3 = new Form(101, isPositiveInteger)
var form4 = new Form(99, isPositiveInteger)
var form5 = new Form(1.1, isInRange)
console.log(form5)